// 引入crypto-js
const CryptoJS = require('crypto-js')

// 十六位十六进制数作为密钥（秘钥为随机生成，必须与后端保持一致！）
// const key = CryptoJS.enc.Utf8.parse('J4ny0Ja678Y7P2so')
// 十六位十六进制数作为密钥偏移量（秘钥为随机生成，必须与后端保持一致！）
// const iv = CryptoJS.enc.Utf8.parse('pTNorfvZW2UZJbd0')

// 解密方法
/**
 * @return {string}
 */
function Dec (v, k) {
  const key = CryptoJS.enc.Utf8.parse(k)
  const value = CryptoJS.enc.Utf8.parse(v)
  // 先将 Base64 还原一下, 因为加密的时候做了一些字符的替换
  // const restoreBase64 = word.replace(/\\-/g, '+').replace(/_/g, '/')
  // 这里 mode, padding, iv 一定要跟加密的时候完全一样
  // 返回的是一个解密后的对象
  const dec = CryptoJS.AES.decrypt(value, key, {
    // iv: iv,
    // mode: CryptoJS.mode.CBC,
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  })
  // 将解密对象转换成 UTF8 的字符串
  // return dec.toString(CryptoJS.enc.Utf8).toString
  // 返回解密结果
  return dec.toString()
}

// 加密方法
/**
 * @return {string}
 */
function Enc (v, k) {
  const key = CryptoJS.enc.Utf8.parse(k)
  const value = CryptoJS.enc.Utf8.parse(v)
  /**
   * CipherOption, 加密的一些选项:
   *   mode: 加密模式, 可取值(CBC, CFB, CTR, CTRGladman, OFB, ECB), 都在 CryptoJS.mode 对象下
   *   padding: 填充方式, 可取值(Pkcs7, AnsiX923, Iso10126, Iso97971, ZeroPadding, NoPadding), 都在 CryptoJS.pad 对象下
   *   iv: 偏移量, mode === ECB 时, 不需要 iv
   *  返回的是一个加密对象
   */
  const dec = CryptoJS.AES.encrypt(value, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
  // 将结果进行base64编码
  // return dec.ciphertext.toString(CryptoJS.enc.Base64)
  return dec.toString()
}

export { Dec, Enc }
